package com.yupi.springbootinit.controller;

import com.yupi.springbootinit.config.ThreadPoolExecutorConfig;
import io.swagger.util.Json;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;


/*
* 队列测试
* */
@Slf4j
@RestController
@RequestMapping("/queue")
@Profile({"dev", "local"})
public class QueueController {

    //自动注入一个线程池实例
    @Resource
    private ThreadPoolExecutor threadPoolExecutor;


    //接受一个参数name，然后将任务添加到线程池中
    @GetMapping("/add")
    public void add(String name){
        //使用CompletableFuture运行一个异步任务
        CompletableFuture.runAsync(()->{
            // 打印一条日志信息，包括任务名称和执行的线程的名称
            log.info("任务执行中：" + name + "，执行的线程：" +  Thread.currentThread().getName());
            // 让线程休眠十分钟，模拟长时间运行的任务
            try{
                Thread.sleep(1000 * 10);
                log.info("任务执行完毕：" + name + "，执行的线程：" +  Thread.currentThread().getName());
            } catch (Exception e){
                e.printStackTrace();
            }
        }, threadPoolExecutor);
    }

    //查看线程池状态
    @GetMapping("get")
    public String get(){
        // 创建一个 Map 存储线程池状态
        Map<String, Object> map = new HashMap<>();
        // 获取线程池长度
        int threadCount = threadPoolExecutor.getPoolSize();
        map.put("线程池长度",threadCount);
        // 获取线程池中已接收的任务数
        long taskCount = threadPoolExecutor.getTaskCount();
        map.put("已接收的任务数",taskCount);
        // 获取线程池中已完成的任务数
        long completedTaskCount = threadPoolExecutor.getCompletedTaskCount();
        map.put("已完成的任务数",completedTaskCount);
        // 获取线程池中正在执行的任务数
        int activeCount = threadPoolExecutor.getActiveCount();
        map.put("正在执行的任务数",activeCount);
        return Json.pretty(map);
    }

}
